package generic;

/**
 * 自定义泛型接口
 *
 * interface 接口名<T,R...>{
 *
 * }
 */
public class CustomGenericInterface {

    public static void main(String[] args) {

        /*
            1)接口中，静态成员不能使用泛型(这个和泛型类规定一样)
            2)泛型接口的类型，在继承接口或者实现接口时确定
            3)没有指定类型，默认为Object
         */

    }
}

interface IA extends IUsb<String, Double> {

}

//当我们去实现IA接口时，因为IA在继承IUsb 接口时，指定了U 为StringR为Double
//，在实现IUsu接口的方法时，使用String替换U, 是Double替换R
class AA implements IA {

    @Override
    public Double get(String s) {
        return null;
    }

    @Override
    public void hi(Double aDouble) {

    }

    @Override
    public void run(Double r1, Double r2, String u1, String u2) {

    }
}

//给 U 指定Integer 给 R 指定了 Float
//所以，当我们实现IUsb方法时，会使用Integer替换U, 使用Float替换R
class BB implements IUsb<Integer, Float> {

    @Override
    public Float get(Integer integer) {
        return null;
    }

    @Override
    public void hi(Float aFloat) {

    }

    @Override
    public void run(Float r1, Float r2, Integer u1, Integer u2) {

    }
}

class CC implements IUsb { //等价 class CC implements IUsb<Object,Object> {

    @Override
    public Object get(Object o) {
        return null;
    }

    @Override
    public void hi(Object o) {
    }

    @Override
    public void run(Object r1, Object r2, Object u1, Object u2) {
    }
}

interface IUsb<U, R> {

    int n = 10;

    //U name; 不能这样使用

    //普通方法中，可以使用接口泛型
    R get(U u);

    void hi(R r);

    void run(R r1, R r2, U u1, U u2);
    //在 jdk8 中，可以在接口中，使用默认方法, 也是可以使用泛型
    default R method(U u) {
        return null;
    }

}